#include "api_memory.h"

/**
 ***********************************************************************
 ** \brief   配置存储器的读写时钟频率
 **
 **
 ** \param 1 :FreqCfg 
 **                               1      - 4MHz;
 **                               2      - 8MHz;
 **                               4      - 16MHz;
 **                               6      - 24MHz;
 **                               8      - 32MHz;
 **                               12     - 48MHz;
 ** \retval   void                                  
 ***********************************************************************/
 
void API_Memory_Init(void)
{
    uint8_t FreqCfg = 1;
	BSP_Flash_Init(FreqCfg);
}


/**
 ***********************************************************************
 ** \brief  存储器中追加日志数据, 如果是空余的空间就写，满了就回到存储器开头
 **
 **
 ** \param 1 :data 数据
 ** 
 ** \retval   void                                  
 ***********************************************************************/
void API_Memory_Write_Waterlog(uint16_t data)
{  	
	 uint32_t empty_addr = 0;
	
	 empty_addr =  BSP_Flash_Sector_Seek(MCU_WaterVolume_ADDR,2);
     
	 if(data ==(((BSP_Flash_ReadByte(empty_addr-1)<<8)+ BSP_Flash_ReadByte(empty_addr-2))))
	 {
	      return ;
	 }
	
	 if(empty_addr >= (MCU_WaterVolume_ADDR+FLASH_SECTOR_SIZE))	
	 {		 	 
		 BSP_Flash_Sector_Clear(MCU_WaterVolume_ADDR);        //先拆
		 BSP_Flash_WriteHalfWord(MCU_WaterVolume_ADDR,data);
	 }
	 else
	 {
		 BSP_Flash_WriteHalfWord(empty_addr,data);
	 }
}



/**
 ***********************************************************************
 ** \brief  存储器中日志读数据
 **
 **
 ** \param   1:data 数据
 ** 
 ** \retval  void                                  
 ***********************************************************************/

void API_Memory_Read_Waterlog(uint16_t *readBuff)
{
    uint32_t empty_addr = 0;
	empty_addr = BSP_Flash_Sector_Seek(MCU_WaterVolume_ADDR,2);
	memcpy(readBuff, (uint16_t *)(empty_addr - 2), 2);	
}

/**
 ***********************************************************************
 ** \brief   读取复位数据
 **
 **
 ** \param   1: *rst_Cnt
 ** 
 ** \retval  void                                  
 ***********************************************************************/

void API_Memory_Read_Restcnt(uint32_t *rst_Cnt)
{
  	BSP_Flash_ReadBytes(MCU_RESET_RECORD_ADDR,(uint8_t *)rst_Cnt,4);	
}



/**
 ***********************************************************************
 ** \brief   写复位数据
 **
 **
 ** \param   1: rst_Cnt
 ** 
 ** \retval  void                                  
 ***********************************************************************/

void API_Memory_Write_Restcnt(uint32_t rst_Cnt)
{

	BSP_Flash_WriteBytes(MCU_RESET_RECORD_ADDR, (uint8_t *)rst_Cnt,sizeof(rst_Cnt));
}

/**
 ***********************************************************************
 ** \brief    往memory写表号,写7字节,做到dl645与cj188兼容
 **
 **
 ** \param   
 ** 
 ** \retval  void                                  
 ***********************************************************************/

void API_Memory_Write_MeterNum(uint8_t *MeterNum)
{
	BSP_Flash_WriteBytes(METER_NUM_ADDR,MeterNum,7);
}
/**
 ***********************************************************************
 ** \brief    从memory中读表号
 **
 **
 ** \param   
 ** 
 ** \retval  void                                  
 ***********************************************************************/

void API_Memory_Read_MeterNum(void *MeterNum)
{
	 BSP_Flash_ReadBytes(METER_NUM_ADDR, (uint8_t *)MeterNum, 7);
}



/**
 ***********************************************************************
 ** \brief    从memory中读阀门状态,用于掉电存储
 **
 **
 ** \param   1: *status  输出阀门的状态
 ** 
 ** \retval  void                                  
 ***********************************************************************/

void API_Memory_Read_VALVEStatus(uint8_t *Vstatus)
{
	 BSP_Flash_ReadBytes(MCU_VALVE_ADDR, Vstatus, 1);
}

/**
 ***********************************************************************
 ** \brief    往memory中写阀门底层状态,枚举类型会出问题
 **
 **
 ** \param   2: status 输入阀门的状态
 ** 
 ** \retval  void                                  
 ***********************************************************************/
void API_Memory_Write_VALVEStatus(uint8_t Vstatus)
{
	Flash_SectorErase(MCU_VALVE_ADDR);
	Flash_WriteBytes(MCU_VALVE_ADDR,&Vstatus,1);
}



